#include <stdio.h>
#include <stdlib.h>
char op[7] = {'+','-','*','/','(',')','#'};
char cmp[7][7] = {{'>', '>', '<', '<', '<', '>', '>'},
 {'>', '>', '<', '<', '<', '>', '>'}, {'>', '>', '>', '>', '<', '>', '>'},
 {'>', '>', '>', '>', '<', '>', '>'}, {'<', '<', '<', '<', '<', '=', '-'},
 {'>', '>', '>', '>', '-', '>', '>'}, {'<', '<', '<', '<', '<', '-', '='}
};

const int MAXSIZE = 100;
typedef struct{ // 运算符
    char data[MAXSIZE];
    int top; // 不能初始化
} StackR;

typedef struct{ // 操作数
    int data[MAXSIZE];
    int top;
}StackD;

void InitStackR(StackR *S){
    S->top = -1;
}

void InitStackD(StackD *S){
    S->top = -1;
}

void PushR(StackR *S, char e){ // 运算符入栈
    if(S->top < MAXSIZE - 1){
        S->data[S->top++] = e;
    }
}

void PushD(StackD *S, char e){ // 操作数入栈
    if(S->top < MAXSIZE - 1){
        S->data[S->top++] = e;
    }
}

void PopR(StackR *S, char *e){ // 运算符出栈
    if(S->top >= 0){
        *e = S->data[S->top--];
    }
}
void PopD(StackD *S, char *e){ // 操作符出栈
    if(S->top >= 0){
        *e = S->data[S->top--];
    }
}

char GetTopR(StackR S){
    if(S.top >= 0){
        return S.data[S.top];
    }
    return 0;
}

char GetTopD(StackD S){
    if(S.top >= 0){
        return S.data[S.top];
    }
    return 0;
}

int IsOperator(char ch){
    for(int i = 0; i < 7; i++){
        if(ch == op[i]) return i;
    }
    return -1;
}
char Compare(char t1, char t2){ // 比较两个运算符的优先关系
    int m, n;
    m = IsOperator(t1);
    n = IsOperator(t2);
    if(m != -1 && n != -1) return cmp[m][n];
    return '-';
}
int Excute(int a, char t, int b){
    int res;
    switch(t){
        case '+': res = a+b; break;
        case '-': res = a-b; break;
        case '*': res = a*b; break;
        case '/': res = a/b; break;
    }
    return res;
}


int StrTopNum()